<?php
namespace App\Helper;

abstract class TimeHelper {
    /**获取当天零点 到当天 整点时间
     * @param string $day
     * @return array
     * [
     *  'start' => '2018-01-01 00:00:00', 当天开始时间
     *  'end'   => '2019-01-01 23:59:59' 当天结算时间
     * ]
     */
    public static function getDayBetween($day)
    {
        //2019-01-01
        $begin  = date('Y-m-d', strtotime($day));

        //减去一秒  2019-01-01 23:59:59
        $end    =date('Y-m-d H:i:s',
            strtotime("{$begin} +1 day") - 1
        ) ;

        return [
            'start' => $begin.' 00:00:00',
            'end'   => $end
        ];
    }

    /**把日期转为 2018-01 这种格式时间
     * @param string $day
     * @return string
     */
    public static function dayToMonth($day)
    {
        return date('Y-m', strtotime($day));
    }

    /**今天日期 2018-01-01
     * @return bool|string
     */
    public static function nowDay()
    {
        return date('Y-m-d');
    }

    /**明天日期 2018-01-02
     * @return bool|string
     */
    public static function tomorowDay()
    {
        $nowDay = static::nowDay();
        return date('Y-m-d', strtotime("{$nowDay} +1 day"));
    }

    /**把日期转为 当天零点时间  2018-01-01 或者 2018-01-01 00:00:00 这两种格式时间
     * @param string $day
     * @param boolean $formatAll false 返回 2018-01-01, true 返回
     * @return string
     */
    public static function toDay($day, $formatAll = false)
    {
        $format = $formatAll ? 'Y-m-d H:i:s' : 'Y-m-d';
        return date($format, strtotime($day));
    }

    /**获取某天日期终点时间 如 2019-01-01 23:59:59
     * @param string $day 2019-01-01 10:00:00
     * @return string
     */
    public static function toDayEnd($day)
    {
        //当天零点时间
        $dayStart = static::toDay($day);
        //当天天日期终点时间 = 下一天零点时间 -1秒
        return date('Y-m-d H:i:s', strtotime("{$dayStart} +1 day") -1 );
    }

    /**获取当月终点时间 如 2019-10-31 23:59:59
     * @param string $day 2019-10
     * @return string
     */
    public static function toMonthEnd($day)
    {
        //当月第一天零点时间
        $dayStart = static::dayToMonth($day);
        //当月最后一天终点时间 = 下一月零点时间 -1秒
        return date('Y-m-d H:i:s', strtotime("{$dayStart} +1 month") -1 );
    }

    /**获取某日期的当月第一天
     * @param $day
     * @param bool|false $format 如果为ture，则返回当月的格式为 Y-m-d H:i:s 否则 返回 Y-m-d
     * @return bool|string
     */
    public static function toMonthStart($day, $format = false)
    {
        $month = date('Y-m', strtotime($day));
        return !$format ? $month : static::toDay($month, true);
    }

    /**获取两个日期之间的每一天
     * @param $start
     * @param $end
     * @return array
     * [
     *      2019-01-01，
     *      2019-01-02
     *      ..以此类推
     * ]
     */
    public static function  getEveryDay($start,$end){//获取两个日期之间的所有日期 2016-04-02至2016-04-16
        $dt_start = strtotime($start);
        $dt_end = strtotime($end);
        $value = [];
        while ($dt_start<=$dt_end){
            $value[] = date('Y-m-d',$dt_start);
            $dt_start = strtotime('+1 day',$dt_start);
        }
        return $value;
    }

    /**获取两个日期之间的每一月
     * @param $start
     * @param $end
     * @return array
     */
    public static function getEveryMonth($start, $end)
    {
        $dt_start = strtotime($start);
        $dt_end = strtotime($end);
        $value = [];
        while ($dt_start<$dt_end){
            $value[] = date('Y-m',$dt_start);
            $dt_start = strtotime('+1 month',$dt_start);
        }
        return $value;
    }
}